package cl.tinet.trainee.tarea6b.ejb;

import java.util.ArrayList;

import javax.annotation.PostConstruct;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;

import org.apache.log4j.Logger;

import cl.tinet.trainee.tarea6b.dao.UsuarioDAO;
import cl.tinet.trainee.tarea6b.dao.UsuarioIDAO;
import cl.tinet.trainee.tarea6b.exceptions.UsuarioEncontradoException;
import cl.tinet.trainee.tarea6b.exceptions.UsuarioException;
import cl.tinet.trainee.tarea6b.exceptions.UsuarioNoEncontradoException;
import cl.tinet.trainee.tarea6b.model.Usuario;

/**
 * Clase que implementa los metodos de la interfaz InterfazUsuarioBean.
 * 
 * @author Frmancil
 * 
 */
@Stateless(mappedName = "userBean", name = "userBean")
public class UsuarioBeanImpl implements UsuarioBean {
    /**
     * 
     */
    private static final Logger LOG = Logger.getLogger(UsuarioBeanImpl.class);
    /**
     * Manejador de entidad y contexto de persistencia de los datos.
     */
    @PersistenceContext(unitName = "MySqlDS")
    private EntityManager em;
    /**
     * 
     */
    private UsuarioIDAO dao;

    /**
     * Instanciador de nuevo Entity Manager para cada acceso a la clase.
     */
    @PostConstruct
    public void init() {
        dao = new UsuarioDAO(em);
    }

    /**
     * {@inheritDoc}
     */
    public void agregarUsuario(Usuario nuevoUsuario) throws UsuarioException {
        Usuario usuario = buscarUsuarioAgregado(nuevoUsuario);
        if (usuario != null) {
            throw new UsuarioEncontradoException(nuevoUsuario.getUsername());
        } else {
            LOG.debug("Agregar usuario: " + nuevoUsuario);
            dao.agregar(nuevoUsuario);
            LOG.debug("Agregar usuario - Agregado");
        }
    }

    /**
     * {@inheritDoc}
     */
    public void borrarUsuario(Usuario usuarioAEliminar)
            throws UsuarioException {
        if (buscarUsuario(usuarioAEliminar) == null) {
            throw new UsuarioNoEncontradoException(usuarioAEliminar.getUsername());
        } else {
            dao.borrar(usuarioAEliminar);
        }
    }

    /**
     * {@inheritDoc}
     */
    public void actualizarUsuario(Usuario usuarioAActualizar)
            throws UsuarioException {
        if (buscarUsuario(usuarioAActualizar) == null) {
            throw new UsuarioNoEncontradoException(usuarioAActualizar.getUsername());
        } else {
            dao.actualizar(usuarioAActualizar);
        }
    }

    /**
     * {@inheritDoc}
     */
    public Usuario leerUsuario(String username){
        return (dao.leer(username));
    }

    /**
     * {@inheritDoc}
     */
    public Usuario buscarUsuario(Usuario usuarioABuscar)
            throws UsuarioException {
        try {
            dao.buscar(usuarioABuscar);
        } catch (NoResultException e) {
            throw new UsuarioNoEncontradoException(usuarioABuscar.getUsername());
        }
        return (dao.buscar(usuarioABuscar));
    }

    /**
     * {@inheritDoc}
     */
    public Usuario buscarUsuarioAgregado(Usuario usuarioABuscar)
            throws UsuarioException {

        Usuario usuario = null;
        try {
            usuario = dao.buscar(usuarioABuscar);
        } catch (NoResultException e) {
            LOG.warn("Usuario no encontrado " + usuarioABuscar.getUsername());
        }
        return usuario;
    }

    /**
     * {@inheritDoc}
     */
    public ArrayList<Usuario> listarUsuarios() {
        return dao.listar();
    }

}
